package core;

import java.sql.ResultSet;
import java.sql.SQLException;

import constants.ProjectConstants;

import tratamentoNotificacoes.NotificationObserver;
import tratamentoNotificacoes.StateObservable;
import utils.MetodosAuxiliares;
import acessoDados.Singleton;
import acessoDados.dao.BaseDAO;

public class ViagemEmEspera implements EstadoViagem { 
	
	@SuppressWarnings("static-access")
	public int cancela(Viagem viagem) throws SQLException, ClassNotFoundException{
		BaseDAO dao = Singleton.getInstance();
		dao.getViagemDAO().cancelaViagem(""+viagem.getIdViagem());
		
		ResultSet rs = dao.getReservaDAO().getReservasDeViagem(""+viagem.getIdViagem());
		StateObservable stObs = new StateObservable();
		while(rs.next()){
			int idReserva = rs.getInt("idReserva");
			
			//adiciona observer ao observable
			NotificationObserver notifObs = new NotificationObserver(idReserva, false);
			stObs.addObserver(notifObs);
			
			//devolve milhas ou dinheiro
			if(rs.getString("tipoPagamento").equalsIgnoreCase(ProjectConstants.TROCAR_MILHAS)){
				dao.getPessoaDAO().addMilhas(rs.getString("login"), rs.getInt("quantPagamento"));
			}
			
			//cancela reservas da viagem
			Reserva reserva = new Reserva();
			
			reserva.setIdReserva(Integer.parseInt(""+idReserva));
			reserva.setIdViagem(rs.getInt("idViagem"));
			reserva.setLogin(rs.getString("login"));
			reserva.setTipoPagamento(rs.getString("tipoPagamento"));
			reserva.setQuantPagamento(rs.getInt("quantPagamento"));
			reserva.setState(rs.getInt("estadoReserva"));
			
			reserva.cancelaReserva();
			
		}
		//notifica observers
		stObs.notifica(""+viagem.getIdViagem());
		
		return 1;
	}

	@SuppressWarnings("static-access")
	public int fecha(Viagem viagem) throws SQLException, ClassNotFoundException{
		BaseDAO dao = Singleton.getInstance();
		dao.getViagemDAO().fechaViagem(""+viagem.getIdViagem());
		ResultSet rs = dao.getReservaDAO().getReservasDeViagem(""+viagem.getIdViagem());
		
		while(rs.next()){
			//expirar reservas da viagem
			Reserva reserva = new Reserva();
			
			reserva.setIdReserva(rs.getInt("idReserva"));
			reserva.setIdViagem(rs.getInt("idViagem"));
			reserva.setLogin(rs.getString("login"));
			reserva.setTipoPagamento(rs.getString("tipoPagamento"));
			reserva.setQuantPagamento(rs.getInt("quantPagamento"));
			reserva.setState(rs.getInt("estadoReserva"));
			
			reserva.expiraReserva();
			
			//acumular milhas aos clientes
			int nrLugares = dao.getReservaDAO().getNumeroLugaresDeReserva(rs.getInt("idReserva"));
			int totalMilhas = nrLugares * MetodosAuxiliares.calculaMilhas(rs.getString("idViagem"));
			dao.getPessoaDAO().addMilhas(rs.getString("login"), Math.round(totalMilhas*ProjectConstants.PERCENTAGEM_DE_MILHAS_PARA_ACUMULACAO));
			
		}
		
		return 1;
	}

}
